// 数据监听器 + 消息订阅器Dep

function defineReactive(data, key, val) {
  // 遍历所有子属性
  observe(val)
  var dep = new Dep()
  Object.defineProperty(data, key, {
    enumerable: true, // 属性是否会出现在for in 或者 Object.keys()的遍历中
    configurable: true, // 属性是否配置，以及可否删除
    get: function () {
      if (dep.target) {
        dep.addSub(dep.target)
      }
      return val
    },
    set: function(newVal) {
      if (val === newVal) {
        return
      }
      val = newVal
      console.log('属性')
      dep.notify()
    }
  })
}

function observe(data) {
  if (!data || typeof data !== 'object') {
    return
  }
  Object.keys(data).forEach(function (key) {
    defineReactive(data, key, data[key])
  })
}

function Dep() {
  this.subs = []
}

Dep.target = null;

Dep.prototype = {
  addSub(sub) {
    this.subs.push(sub)
  },
  notify() {
    this.subs.forEach( sub => {
      sub.update()
    })
  }
}

var library = {
  book1: { name: '' },
  book2: ''
}

observe(library)
library.book1.name = 'vue权威指南'
library.book2 = '没有书籍'